home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Bavarian
/
Bavarian #121 (19xx)(APS Electronic).zip
/
Bavarian #121 (19xx)(APS Electronic).adf
/
SuperPRINT
(
.txt
)
< prev
next >
Wrap
AmigaBASIC Source Code
|
1987-05-08
|
14KB
|
525 lines
'======================================
'|| S u p e r P R I N T ||
'======================================
' geschrieben von Michael Grauli
' Richener Str. 54
' 7519 Gemmingen
'--------------------------------------
' Dieses Programm ist Public Domain,
' d.h. es darf frei kopiert und
' und weitergegeben werden !
'--------------------------------------
DEFLNG a-z : GOSUB Titel
DECLARE FUNCTION ALLOCMEM LIBRARY
DECLARE FUNCTION ALLOCSIGNAL LIBRARY
DECLARE FUNCTION FINDTASK LIBRARY
DECLARE FUNCTION DOIO LIBRARY
DECLARE FUNCTION OPENDEVICE LIBRARY
DECLARE FUNCTION OPENSCREEN LIBRARY
DECLARE FUNCTION OPENWINDOW LIBRARY
DECLARE FUNCTION GETMSG LIBRARY
DECLARE FUNCTION READPIXEL LIBRARY
DECLARE FUNCTION AVAILFONTS LIBRARY
DECLARE FUNCTION OPENFONT LIBRARY
DECLARE FUNCTION OPENDISKFONT LIBRARY
DECLARE FUNCTION TEXTLENGTH LIBRARY
LIBRARY "intuition.library"
LIBRARY "graphics.library"
LIBRARY "diskfont.library"
LIBRARY "exec.library"
DEF FNlongint(ga) = PEEKL(PEEKL(ga+34)+28)
ON BREAK GOSUB CtrlC : BREAK ON
GOSUB Init
GOSUB Fensteran
GOSUB Abfrage
GOSUB Fensteraus
CLOSEMEM fo(0)
FREEMEM must,6
LIBRARY CLOSE
SYSTEM
Titel:
LINE (200,50)-(420,130),1,bf
LINE (200,50)-(420,130),2,b
POKE WINDOW(8)+56,2
POKE WINDOW(8)+28,0 : COLOR 2
POKEW WINDOW(8)+36,234 : POKEW WINDOW(8)+38,70
PRINT "S u p e r P R I N T"
POKEW WINDOW(8)+36,236 : POKEW WINDOW(8)+38,69
PRINT "S u p e r P R I N T"
POKEW WINDOW(8)+36,238 : POKEW WINDOW(8)+38,70
PRINT "S u p e r P R I N T"
POKEW WINDOW(8)+36,236 : POKEW WINDOW(8)+38,71
PRINT "S u p e r P R I N T" : COLOR 3
POKEW WINDOW(8)+36,236 : POKEW WINDOW(8)+38,70
PRINT "S u p e r P R I N T"
POKE WINDOW(8)+56,4 : LOCATE 12,27 : COLOR 2
PRINT "Ein Public-Domain Programm" : LOCATE 14,29
PRINT "von Michael Grauli 1989"
RETURN
Init:
SETWINDOWTITLES WINDOW(7),SADD("Bitte warten ..."+CHR$(0)),0
DIM fo(20),gr(20,20),ng(60),fole%(20)
fonts = ALLOCMEM(1000,65537)
IF fonts = 0 THEN ERROR 7
e = AVAILFONTS(fonts,1000,3)
IF e <> 0 THEN ERROR 5
af = PEEKW(fonts) : nf = 1
spa5$ = SPACE$(5) : spa20$ = SPACE$(20)
FOR i = 0 TO af-1
fo$ = STRING$(20,0)
add = PEEKL(fonts+i*10+4)
COPYMEM add,SADD(fo$),20
fo$ = LEFT$(fo$,INSTR(fo$,CHR$(0))-1)
fole% = LEN(fo$)
fo$ = fo$+SPACE$(20-LEN(fo$))
IF fo$ <> lafo$ THEN
OPENMEM fo(0),gr(nf,ng(nf)+1),5
COPYMEM SADD(spa5$),gr(nf,ng(nf)+1),5
nf = nf+1 : fole%(nf) = fole%
OPENMEM fo(0),fo(nf),20
COPYMEM SADD(fo$),fo(nf),20
lafo$ = fo$
OPENMEM fo(0),gr(nf,0),5
COPYMEM SADD(spa5$),gr(nf,0),5
END IF
ng(nf) = ng(nf)+1
gr$ = STR$(PEEKW(fonts+i*10+8))
gr$ = gr$+SPACE$(5-LEN(gr$))
OPENMEM fo(0),gr(nf,ng(nf)),5
COPYMEM SADD(gr$),gr(nf,ng(nf)),5
NEXT i
OPENMEM fo(0),fo(1),20
COPYMEM SADD(spa20$),fo(1),20
OPENMEM fo(0),fo(nf+1),20
COPYMEM SADD(spa20$),fo(nf+1),20
OPENMEM fo(0),gr(nf,ng(nf)+1),5
COPYMEM SADD(spa5$),gr(nf,ng(nf)+1),5
FREEMEM fonts,1000
spa5$ = "" : spa20$ = "" : fo$ = "" : gr$ = ""
zeif = 2 : zeig = 1
IF nf = 0 THEN ERROR 5
must = ALLOCMEM(6,65539)
IF must = 0 THEN ERROR 7
POKEW must,&Hffff
POKEW must+2,&Hcccc
POKEW must+4,&H3333
WINDOW CLOSE 1
prefs = ALLOCMEM(220,65537)
GETPREFS prefs,220
POKEW prefs+170,1
POKEW prefs+172,1
SETPREFS prefs,220,-1
FREEMEM prefs,220
RETURN
CtrlC: RETURN
Textzeigen:
SETRAST rp2,0
IF altfo <> zeif OR altgr <> zeig THEN
altfo$ = STRING$(fole%(zeif),0)
altgr$ = STRING$(5,0)
COPYMEM fo(zeif),SADD(altfo$),fole%(zeif)
COPYMEM gr(zeif,zeig),SADD(altgr$),5
texta(0) = SADD(altfo$+CHR$(0))
texta(1) = VAL(altgr$)*65536
IF zeif = 2 THEN
neufont = OPENFONT(VARPTR(texta(0)))
ELSE
neufont = OPENDISKFONT(VARPTR(texta(0)))
END IF
IF neufont = 0 THEN
zeif = altfo : zeig = altgr
GOSUB Fontszeigen
GOSUB Groessenzeigen
ELSE
IF font <> 0 THEN CLOSEFONT font
altfo = zeif : altgr = zeig : font = neufont
SETFONT rp2,font
END IF
baseline = PEEKW(rp2+62)
fohoehe = PEEKW(rp2+58)
END IF
SCREENTOFRONT sc2
POKEW rp2+64,ABS(FNlongint(ga1(35)))
IF READPIXEL(rp1,91,66) THEN stil = 1 :ELSE stil = 0
IF READPIXEL(rp1,231,66) THEN stil = stil+2
IF READPIXEL(rp1,301,66) THEN stil = stil+4
IF fohoehe = 16 THEN stil = 0
POKE rp2+56,stil
IF READPIXEL(rp1,71,83) THEN out = ABS(FNlongint(ga1(15))) :ELSE out = 0
ax% = out+1 : ay% = baseline+out+1
IF stil AND 4 THEN ax% = ax%+fohoehe\8
READSTR ga1(41),tex$
le = TEXTLENGTH(rp2,SADD(tex$),LEN(tex$))
IF le = 0 THEN RETURN
mx% = ax% : my% = ay% : d3pu = 0
IF READPIXEL(rp1,71,117) THEN
d3pu = ABS(FNlongint(ga1(29)))
mx% = ax%+d3pu : my% = ay%+d3pu
END IF
sx% = mx% : sy% = my% : schapu = 0
IF READPIXEL(rp1,71,100) THEN
schapu = ABS(FNlongint(ga1(22)))
sx% = mx%+schapu : sy% = my%+schapu
END IF
maxx% = sx%+le+out : maxy% = sy%+fohoehe-baseline+out
IF stil AND 2 THEN maxx% = maxx%+1
IF stil AND 4 THEN maxx% = maxx%+fohoehe\2.5
SETAPEN rp2,1 : RECTFILL rp2,0,0,maxx%,maxy%
IF schapu > 0 THEN OUTLINE rp2,sx%,sy%,tex$,out,28-schattfa
IF d3pu > 0 THEN
FOR i = 0 TO d3pu-1
dx% = mx%-i : dy% = my%-i
OUTLINE rp2,dx%,dy%,tex$,out,35-d3fa
NEXT i
END IF
IF out THEN OUTLINE rp2,ax%,ay%,tex$,out,21-outfa
OUTLINE rp2,ax%,ay%,tex$,0,41-schrifa
RETURN
Abfrage:
mp = PEEKL(wi1+86)
WHILE a = 0
WHILE me = 0
me = GETMSG(mp)
WEND
READMSG me
IF class = 64 THEN
IF gadid = 4 THEN
IF zeif > 2 THEN
zeif = zeif-1 : zeig = 1
GOSUB Fontszeigen
GOSUB Groessenzeigen
END IF
ELSEIF gadid = 5 THEN
IF zeif < nf THEN
zeif = zeif+1 : zeig = 1
GOSUB Fontszeigen
GOSUB Groessenzeigen
END IF
ELSEIF gadid = 9 THEN
IF zeig > 1 THEN zeig = zeig-1 : GOSUB Groessenzeigen
ELSEIF gadid = 10 THEN
IF zeig < ng(zeif) THEN zeig = zeig+1 : GOSUB Groessenzeigen
ELSEIF gadid = 15 THEN
ACTIVATEGADGET ga1(22),wi1,0
ELSEIF gadid = 22 THEN
ACTIVATEGADGET ga1(29),wi1,0
ELSEIF gadid = 29 THEN
ACTIVATEGADGET ga1(35),wi1,0
ELSEIF gadid = 35 THEN
ACTIVATEGADGET ga1(41),wi1,0
ELSEIF gadid = 42 THEN
ACTIVATEGADGET ga1(43),wi1,0
ELSEIF gadid = 45 THEN
GOSUB Textzeigen
IF le = 0 THEN RETURN
IF maxx% > 319 THEN maxx% = 319
IF maxy% > 79 THEN maxy% = 79
sbreit% = FNlongint(ga1(42))
shoch% = FNlongint(ga1(43))
IF sbreit% < 1 THEN sbreit% = 1
IF shoch% < 1 THEN shoch% = 1
SETRGB4 vp,3,7,7,7
SETRGB4 vp,4,3,3,3
PRT rp2,0,0,maxx%+1,maxy%+1,sbreit%,shoch%,1
SETRGB4 vp,4,5,5,5
SETRGB4 vp,3,9,9,9
SCREENTOFRONT sc2
ELSE
GOSUB Textzeigen
END IF
ELSEIF class = 32 THEN
IF gadid > 15 AND gadid < 21 THEN
GADGETGROUP rp1,ga1(),outfa,gadid
ELSEIF gadid > 22 AND gadid < 28 THEN
GADGETGROUP rp1,ga1(),schattfa,gadid
ELSEIF gadid > 29 AND gadid < 35 THEN
GADGETGROUP rp1,ga1(),d3fa,gadid
ELSE
GADGETGROUP rp1,ga1(),schrifa,gadid
END IF
ELSE
a = 1
END IF
WEND : a = 0
RETURN
Fontszeigen:
SETAPEN rp1,2 : SETBPEN rp1,3
MOVE rp1,142,40 : TEXT rp1,fo(zeif),20
SETAPEN rp1,1 : SETBPEN rp1,0
MOVE rp1,142,29 : TEXT rp1,fo(zeif-1),20
MOVE rp1,142,51 : TEXT rp1,fo(zeif+1),20
RETURN
Groessenzeigen:
SETAPEN rp1,2 : SETBPEN rp1,3
MOVE rp1,422,40 : TEXT rp1,gr(zeif,zeig),5
SETAPEN rp1,1 : SETBPEN rp1,0
MOVE rp1,422,29 : TEXT rp1,gr(zeif,zeig-1),5
MOVE rp1,422,51 : TEXT rp1,gr(zeif,zeig+1),5
RETURN
Fensteran:
NEWSCREEN sc2,"",320,80,3,0
NEWWINDOW wi2,"",0,0,320,80,67584,0,sc2
vp = sc2+44 : rp2 = PEEKL(wi2+50)
SETRGB4 vp,1,15,15,15
SETRGB4 vp,2,13,13,13
SETRGB4 vp,3,9,9,9
SETRGB4 vp,4,5,5,5
SETRGB4 vp,5,0,0,0
SETDRMD rp2,0
MOVESCREEN sc2,0,203
DIM ga1(50)
GADGET ga1(),140,20,164,12,"",0
GADGET ga1(),140,31,164,12,"Zeichensatz :"+SPACE$(38),0
GADGET ga1(),140,42,164,12,"",0
GADGET ga1(),320,20,20,12,"/\",1
GADGET ga1(),320,42,20,12,"\/",1
GADGET ga1(),420,20,84,12,"",0
GADGET ga1(),420,31,84,12,"Höhe :"+SPACE$(20),0
GADGET ga1(),420,42,84,12,"",0
GADGET ga1(),520,20,20,12,"/\",1
GADGET ga1(),520,42,20,12,"\/",1
GADGET ga1(),90,65,120,12,"Stil : Unterstrichen"+SPACE$(10),256
GADGET ga1(),230,65,50,12,"Fett",256
GADGET ga1(),300,65,70,12,"Kursiv",256
GADGET ga1(),70,82,70,12,"Outline",256
GADGET ga1(),170,82,28,12,SPACE$(12)+"Punkte",2049
GADGETSTR ga1(),15,MKL$(1),3
GADGET ga1(),420,82,24,12,"Outlinefarbe :"+SPACE$(23),2
FOR x% = 460 TO 580 STEP 40
GADGET ga1(),x%,82,24,12,"",2
NEXT x%
GADGET ga1(),70,99,70,12,"Schatten",256
GADGET ga1(),170,99,28,12,SPACE$(12)+"Punkte",2049
GADGETSTR ga1(),22,MKL$(2),3
GADGET ga1(),420,99,24,12,"Schattenfarbe :"+SPACE$(22),2
FOR x% = 460 TO 580 STEP 40
GADGET ga1(),x%,99,24,12,"",2
NEXT x%
GADGET ga1(),70,116,70,12,"3-D",256
GADGET ga1(),170,116,28,12,SPACE$(12)+"Punkte",2049
GADGETSTR ga1(),29,MKL$(4),3
GADGET ga1(),420,116,24,12,"3-D Farbe :"+SPACE$(26),2
FOR x% = 460 TO 580 STEP 40
GADGET ga1(),x%,116,24,12,"",2
NEXT x%
GADGET ga1(),170,133,28,12,"Zeichenabstand :"+SPACE$(8)+"Punkte"+SPACE$(12),2049
GADGETSTR ga1(),35,MKL$(0),3
GADGET ga1(),420,133,24,12,"Schriftfarbe :"+SPACE$(23),2
FOR x% = 460 TO 580 STEP 40
GADGET ga1(),x%,133,24,12,"",2
NEXT x%
GADGET ga1(),90,155,280,12,"Text :"+SPACE$(47),1
GADGETSTR ga1(),41,"",34
GADGET ga1(),110,177,28,12," Drucken :"+SPACE$(7)+"Seiten breit",2049
GADGETSTR ga1(),42,MKL$(1),2
GADGET ga1(),270,177,44,12,SPACE$(12)+"1/ Seite hoch",3072
GADGETSTR ga1(),43,MKL$(1),2
GADGET ga1(),420,155,90,34,"Zeigen",1
GADGET ga1(),530,155,90,34,"Drucken",1
ga=ga1(1)
NEWWINDOW wi1,"SuperPRINT",0,0,640,200,69646,608,0
SCREENTOFRONT sc2
tit = ALLOCMEM(11,65537)
t = PEEKL(wi1+32) : COPYMEM t,tit,10
POKEL wi1+32,tit : rp1 = PEEKL(wi1+50)
POKEL rp1+8,must : POKE rp1+29,1
SETAPEN rp1,2 : SETBPEN rp1,2
FOR x% = 421 TO 581 STEP 40
IF x% = 461 THEN SETBPEN rp1,1
IF x% = 501 THEN POKEL rp1+8,must+2
IF x% = 541 THEN POKEL rp1+8,must : SETAPEN rp1,1 : SETBPEN rp1,2
IF x% = 581 THEN SETBPEN rp1,1
FOR y% = 83 TO 134 STEP 17
RECTFILL rp1,x%,y%,x%+21,y%+9
NEXT y%,x%
POKEL rp1+8,0 : POKE rp1+29,0
SETAPEN rp1,3
RECTFILL rp1,141,32,302,41
RECTFILL rp1,421,32,502,41
GOSUB Fontszeigen
GOSUB Groessenzeigen
GADGETGROUP rp1,ga1(),19,0 : outfa = 19
GADGETGROUP rp1,ga1(),25,0 : schattfa = 25
GADGETGROUP rp1,ga1(),31,0 : d3fa = 31
GADGETGROUP rp1,ga1(),36,0 : schrifa = 36
ACTIVATEGADGET ga1(41),wi1,0
RETURN
Fensteraus:
IF font <> 0 THEN CLOSEFONT font : font = 0
CLOSEWINDOW wi2
CLOSESCREEN sc2
CLOSEWINDOW wi1
CLOSEMEM ga1(0)
RETURN
SUB PRT (rp,x%,y%,b%,h%,db%,dh%,sp%) STATIC
SHARED vp : cm = PEEKL(vp+4)
vm% = PEEKW(vp+32) : bit = ALLOCSIGNAL(-1)
po = ALLOCMEM(40,65537) : IF po = 0 THEN ERROR 7
t = FINDTASK(0) : t$ = "PRT"+CHR$(0)
POKE po+8,4 : POKEL po+10,SADD(t$)
POKE po+15,bit : POKEL po+16,t
ADDPORT po : r = ALLOCMEM(64,65537)
IF r = 0 THEN ERROR 7
POKE r+8,5 : POKE r+9,0 : POKEL r+14,po
d$ = "printer.device"+CHR$(0)
e = OPENDEVICE&(SADD(d$),0,r,0)
IF e <> 0 THEN 1
IF sp% = 1 THEN
da = PEEKL(PEEKL(r+20)+92)+12
dh = PEEKL(da+26)/dh%
db = (PEEKW(da+36)*11)*db%
END IF
POKEW r+28,11 : POKEL r+32,rp
POKEL r+36,cm : POKEL r+40,vm
POKEW r+44,x% : POKEW r+46,y%
POKEW r+48,b% : POKEW r+50,h%
POKEL r+52,db : POKEL r+56,dh
e = DOIO(r)
CLOSEDEVICE r : POKE r+8,&Hff
POKEL r+20,-1 : POKEL r+24,-1
1 FREEMEM r,64 : REMPORT po
POKE po+8,&Hff : POKEL po+20,-1
FREESIGNAL bit : FREEMEM po,40
END SUB
SUB READMSG (me) STATIC
SHARED class,code%
SHARED menuid,itemid,subid
SHARED gadid
class = PEEKL(me+20)
code% = PEEKW(me+24)
IF class = 256 THEN
menuid = (code% AND 31)
itemid = (code% AND 992)\32
subid = (code% AND 31744)\2048
ELSEIF class = 32 OR class = 64 THEN
gadid = PEEKW(PEEKL(me+28)+38)
END IF
REPLYMSG me : me = 0
END SUB
SUB GADGET (ga(),x%,y%,b%,h%,t$,a%) STATIC
lg = ga(UBOUND(ga))
OPENMEM ga(0),ga,105+LEN(t$)
IF lg = 0 THEN n% = 1 :ELSE n% = PEEKW(lg+38)+1
POKEW ga,-1 : POKEW ga+2,-1
POKE ga+4,1 : POKE ga+7,5
POKEL ga+8,ga+20 : POKEW ga+24,b%-1
POKEW ga+28,b%-1 : POKEW ga+30,h%-1
POKEW ga+34,h%-1 : POKE ga+40,1
POKEW ga+44,(b%-LEN(t$)*8+1)\2-1
POKEW ga+46,(h%+1)\2-5
POKEL ga+52,ga+104 : COPYMEM SADD(t$),ga+104,LEN(t$)
POKEW ga+64,x%+1 : POKEW ga+66,y%+1
POKEW ga+68,b%-2 : POKEW ga+70,h%-2
POKEW ga+74,a% : POKEW ga+76,1
POKEL ga+78,ga : POKEL ga+86,ga+40
POKEW ga+98,n% : ga(n%) = ga+60
IF lg <> 0 THEN POKEL lg,ga(n%)
ga(UBOUND(ga)) = ga(n%)
END SUB
SUB GADGETSTR (ga(),n%,t$,l%) STATIC
ga = ga(n%) : bo = PEEKL(ga+18)
OPENMEM ga(0),sp,40+l%*2
POKEW bo,-2 : POKEW bo+2,-2
POKEW ga+4,PEEKW(ga+4)+1
POKEW ga+6,PEEKW(ga+6)+1
POKEW ga+8,PEEKW(ga+8)-2
POKEW ga+10,8 : POKEW ga+16,4
POKEL ga+34,sp : POKEL sp,sp+36
POKEL sp+4,sp+38+l% : POKEW sp+10,l%
IF PEEKW(ga+14) AND 2048 THEN
i = CVL(t$) : POKEL sp+28,i
t$ = RIGHT$(STR$(i),LEN(STR$(i))-1)
END IF
COPYMEM SADD(t$),sp+36,LEN(t$)
POKEW sp+8,LEN(t$)
END SUB
SUB READSTR (ga,t$) STATIC
sp = PEEKL(ga+34)
l = PEEKW(sp+16) : t$ = STRING$(l,0)
COPYMEM sp+36,SADD(t$),l
END SUB
SUB NEWSCREEN (sc,t$,b%,h%,t%,m) STATIC
SHARED bi
ns = ALLOCMEM(32,65537)
IF ns = 0 THEN ERROR 7
POKEW ns+4,b% : POKEW ns+6,h%
POKEW ns+8,t% : POKE ns+10,2
POKE ns+11,1 : POKEW ns+12,m
POKEW ns+14,143 : POKEL ns+28,bi
IF bi <> 0 THEN POKEW ns+14,207
POKEL ns+20,SADD(t$+CHR$(0))
sc = OPENSCREEN(ns)
IF sc = 0 THEN ERROR 5
FREEMEM ns,32
END SUB
SUB NEWWINDOW (wi,t$,x%,y%,b%,h%,f,i,sc) STATIC
SHARED ga
nw = ALLOCMEM(48,65537)
IF nw = 0 THEN ERROR 7
POKEW nw,x% : POKEW nw+2,y%
POKEW nw+4,b% : POKEW nw+6,h%
POKE nw+8,2 : POKE nw+9,1
POKEL nw+10,i : POKEL nw+14,f
POKEL nw+18,ga : POKEL nw+30,sc
POKEL nw+26,SADD(t$+CHR$(0))
IF t$ = "" THEN POKEL nw+26,0
IF sc = 0 THEN t = 1 :ELSE t = 15
POKEW nw+38,90 : POKEW nw+40,40
POKEW nw+42,-1 : POKEW nw+44,-1
POKEW nw+46,t
wi = OPENWINDOW(nw)
IF wi = 0 THEN ERROR 5
FREEMEM nw,48
END SUB
SUB BOX (rp,x1%,y1%,x2%,y2%) STATIC
a%(0) = x2% : a%(1) = y1%
a%(2) = x2% : a%(3) = y2%
a%(4) = x1% : a%(5) = y2%
a%(6) = x1% : a%(7) = y1%
MOVE rp,x1%+1,y1%
POLYDRAW rp,4,VARPTR(a%(0))
END SUB
SUB GADGETGROUP (rp,ga(),n,gadid) STATIC
SETDRMD rp,2
IF gadid > 0 THEN
x% = PEEKW(ga(gadid)+4) : y% = PEEKW(ga(gadid)+6)
BOX rp,x%-5,y%-3,x%+PEEKW(ga(gadid)+8)+4,y%+PEEKW(ga(gadid)+10)+2
SWAP n,gadid
ELSE
gadid = n
END IF
x% = PEEKW(ga(gadid)+4) : y% = PEEKW(ga(gadid)+6)
BOX rp,x%-5,y%-3,x%+PEEKW(ga(gadid)+8)+4,y%+PEEKW(ga(gadid)+10)+2
SETDRMD rp,1
END SUB
SUB OPENMEM (li,mem,le%) STATIC
mem = ALLOCMEM(le%+8,65537)
IF mem = 0 THEN ERROR 7
POKEL mem,li
POKEL mem+4,le%+8
li = mem : mem = mem+8
END SUB
SUB CLOSEMEM (li) STATIC
WHILE li <> 0
mem = PEEKL(li)
le = PEEKL(li+4)
FREEMEM li,le : li = mem
WEND
END SUB
SUB OUTLINE (rp,x%,y%,t$,out,f) STATIC
SETAPEN rp,f
IF out = 0 THEN
MOVE rp,x%,y%
TEXT rp,SADD(t$),LEN(t$)
ELSE
FOR j = 1 TO out
FOR i! = 0 TO 6.3 STEP 1.57/j^2
x = SIN(i!)*j+x% : y = COS(i!)*j+y%
MOVE rp,x,y : TEXT rp,SADD(t$),LEN(t$)
NEXT i!,j
END IF
END SUB